/*
*    Author : heiden deng(dengjianquan@beyondcent.com)
*    2017/05/15
*    version 0.0.9
*    通用操作函数
*/

#ifndef HTSC_GRPC_UTILS_H
#define HTSC_GRPC_UTILS_H
#include "htsc_types.h"
#ifndef WIN64
#include <sys/types.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif


//获取本地IP地址,返回字符指针无需释放
char *get_local_ip();

//获取进程ID
int grpc_getpid();

//返回当前时间（单位毫秒ms）
uint64_t htsc_get_timestamp_in_mills();

//返回应用程序名，返回空间无需释放
char* htsc_get_provider_AppName();

//根据方法全名提取服务名,例如/com.test.hello/sayHello,返回com.test.hello,返回内容无需释放
char* get_service_name(char *method_full_name, char *buf, size_t buf_len);

//去除字符串开头以及结尾的空字符
void trim(char *strIn, char *strOut);


//获取执行程序的执行目录
#ifndef WIN64
 #define _getcwd getcwd
 #define PATH_SEPRATOR '/'
#else
 #define PATH_SEPRATOR '\\'
#endif


// non C99 standard functions
//#if __STDC_VERSION__ >= 199901L
char *gprc_strdup(const char *str);
//#endif

#define CHECK_BUF(free_size) if((free_size) <= 0) {htsc_log("buffer space is not enough");return -1;}
#define STRING(str) #str
#define FREE_PTR(ptr) if(ptr){free(ptr);ptr = NULL;}
#define REINIT(buf) {memset(buf,0,sizeof(buf));}


void htsc_log(char *msg);

int countchar(char *str, char a);

//判断pattern字符串是否以value开头
bool isStartWith(const char *pattern, const char* value);

//判断pattern是否以value结尾
bool isEndsWith(const char *pattern, const char* value);

/*
拷贝字符串，不包括pEnd位置字符
必须确保buf空间足够大
*/
int copystr0(char* buf, char *pSrc, char *pEnd);

char *copystr(char *pSrc, char *pEnd);


//将负载均衡枚举类型转成字符串类型,返回空间无需释放
char* lb_strategy_to_str(loadbalance_strategy_t strategy);

//将负载均衡字符串类型转成枚举类型
loadbalance_strategy_t lb_strategy_from_str(char *strategy);

//将故障切换枚举类型转成字符串类型，范湖空间无需释放
char* cluster_strategy_to_str(cluster_strategy_t strategy);

//将故障切换字符串类型转成枚举类型
cluster_strategy_t cluster_strategy_from_str(char *strategy);

//新分配provider结构体对象，并初始化字段
provider_t* new_provider();


//根据配置文件初始化provider特定字段
void init_provider(provider_t *provider);

//释放provider空间
void free_provider(provider_t **p);

//释放provider空间
void free_provider_v2(provider_t *p);

/*
* 使用线程Sleep指定毫秒数。
*/
void htsc_grpc_sleep_mills(int64_t millsecond);

#ifdef __cplusplus
}
#endif

#endif // !HTSC_GRPC_UTILS_H
